Тема: Паралельні асинхронні процеси в ОС UNIX.
Мета: Засвоїти основи паралельних обчислень. Навчитись користуватись утилітою make, виконувати C-задачі в ОС UNIX.
Загальні відомості
1.1. Мова C тісно пов‘язана з ОС UNІX, тому що спочатку була розроблена саме для реалізації ядра операційної системи. Тому, у першу чергу, вона дуже зручна для програмування задач, що використовують системні виклики операційної системи, наприклад, для організації низькорівневого вводу/виводу, керування пам'яттю чи фізичними пристроями, організації зв'язку між процесами і т.д.
1.2. Наберемо текст класичної програми у файл HelloWorld.c:
#include <stdio.h>
void main(void)
{
printf("Hello, world.\n");
return;
}
1.3. Для компіляції цієї програми використаємо компілятор gcc. Основними перевагами gcc є те що він надійний, доступний на багатьох платформах, безкоштовний і його вихідні С коди є відкритими (open-source). Компілятор gcc може компілювати C, C++ та objective-C програми. Насправді gcc є одночасно і компілятором, і лінкером.
Загальна форма виклику gcc виглядає наступним чином:
gcc [опції] [файли]
Розглянемо основні опції компілятора gcc:
-c [файли]
Компілювати файли у об‘єктні не проходячи фази лінкування.
точну послідовність дій необхідних для породження нової версії. Ця інформація за допомогою текстового редактора поміщається у файл з описами. Спираючись на вміст файлу з описами, make визначає, які команди потрібно передати командному інтерпретатору (shell) для виконання, щоб гарантувати автоматичне формування кінцевого продукту.
1.5. Алгоритм загалом виглядає так. У файлі з описами визначається ім'я цільового файлу (чи файлів). Перевіряються усі файли, від яких залежить цільовий: якщо файл не існує або застарів, він породжується заново (перевірка супроводжується переглядом описів, при якому цей файл у свою чергу трактується як цільовий.) Нарешті, якщо один з цих файлів модифікований пізніше цільового, останній створюється заново. Подібний рекурсивний перегляд залежностей дозволяє при формуванні нової версії програми породжувати заново тільки ті файли, до яких відносились останні зміни.
1.6. Утиліта make буває корисна в наступних випадках:
- При розробці програм утиліта make може автоматично оновлювати виконавчий файл, як тільки зміниться будь-який вихідний чи об'єктний файл.
- При керуванні бібліотеками утиліта make може автоматично перебудувати бібліотеку, як тільки зміниться один з модулів бібліотеки.
- У мережному середовищі утиліта make може автоматично оновлювати локальну копію програми чи файлу, збережених у мережі, як тільки основна копія буде змінена.
1.7. Утиліта make діє, спираючись на три джерела інформації:
- Заданий користувачем файл описів.
- Імена файлів і часи останньої модифікації, отримані від файлової системи.
- Вбудовані правила.
1.8. Виклик утиліти make виглядає наступним чином:
make [опції] [макровизначення] [цільові файли]
Аргументи командного рядка інтерпретуються в такий спосіб. Насамперед аналізуються аргументи, що є макровизначеннями (тобто аргументи, що містять всередині себе знаки рівності), і виконуються необхідні присвоювання. Потім розглядаються аргументи-опції:
-f make-файл
Вказати ім‘я файлу з описами. Якщо опція -f не зазначена, читається файл з ім'ям makefіle (чи Makefіle) з поточного каталогу.
-p
Вивести усі макровизначення, а також описи залежностей і операцій для створення цільових файлів.
-і
Ігнорувати коди помилок, що повертаються програмами, які запускаються. Цей режим встановлюється також з появою у файлі описів спеціального цільового імені .ІGNORE.
-k
При помилці припиняти виконання команд, пов'язаних з поточною залежністю, але продовжувати обробку інших залежностей.
-s
Не виводити командні рядки перед їх виконанням. Цей режим встановлюється також з появою у файлі описів спеціального цільового імені .SІLENT.
-r
Не використовувати вбудовані правила.
-n
Виводити команди, але не виконувати їх. Виводяться навіть...